package main

import (
	"fmt"
	"os"
)

func directWriteByteSliceToFile(path string, data []byte) (int, error) {
	f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) // 创建并打开文件，如果文件不存在，则创建。 os.O_APPEND 采用追加模式
	// os.O_RDWR 读写方式打开
	// os.O_CREATE 不存在则创建
	if err != nil {
		fmt.Println("open file failed:", err)
		return 0, err
	}
	defer func() {
		f.Sync() // 将处于内存中的数据存储到本地磁盘文件中
		f.Close()
	}()

	return f.Write(data)
}

func directReadByteSliceFromFile(path string, data []byte) (int, error) {
	f, err := os.Open(path) // 只读模式打开 == os.OpenFile() os.O_RDONLY

	if err != nil {
		fmt.Println("open file failed:", err)
		return 0, err
	}
	defer f.Close()
	// 从文件开头开始读，写入到 字节切片中
	//return f.Read(data)
	n, err := f.Read(data)
	return n, err

}

func main() {
	file := "2.txt"
	text := "hello gopher"
	buf := make([]byte, 20) // 注意字节切片的长度

	n, err := directWriteByteSliceToFile(file, []byte(text))
	if err != nil {
		fmt.Println("write file error:", err)
		return
	}

	n, err = directReadByteSliceFromFile(file, buf)
	if err != nil {
		fmt.Println("read file error:", err)
		return
	}
	fmt.Printf("read %d bytes from file: %q\n", n, buf)

}
